package com.tianji.learning.listener;

import com.tianji.api.dto.trade.OrderBasicDTO;
import com.tianji.common.constants.MqConstants;
import com.tianji.learning.service.ILearningLessonService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 监听添加课程消息
 */

@Component
@Slf4j
@RequiredArgsConstructor // 这个就是帮我们生成构造方法的
// lombok是在编译器生成相应的方法的
public class LessonChangeListener {

    private final ILearningLessonService learningLessonService;

    // 监听
    // durable表示是否持久化
    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "learning.lesson.pay.queue", durable = "true"),
            exchange = @Exchange(name = MqConstants.Exchange.ORDER_EXCHANGE, type = ExchangeTypes.TOPIC),
            key = MqConstants.Key.ORDER_PAY_KEY))
    // 收到消息我们应该用什么类喃，就是看他发消息的时候用的是什么类我们就用什么类
    // 因为当时我们发送的时候不是用的字符串而是使用的泛型，只要你类型正确就是可以的
    public void listenPay(OrderBasicDTO orderBasicDTO) {
        log.info("LessonChangeListener 接受到了消息,用户{},添加课程{}", orderBasicDTO.getUserId(), orderBasicDTO.getCourseIds());
        // 1、校验
        if (orderBasicDTO.getUserId() == null || orderBasicDTO.getCourseIds() == null || orderBasicDTO.getCourseIds().size() == 0) {
            // 相当于你消息有问题，但是如果你抛异常的他就会去重试，但是终究是这个消息的问题，你再怎么重试都是不行的
            log.error("LessonChangeListener 接受到了空消息");
            // 注意不要抛异常 这里就直接返回就可以了
            return;
        }
        // 2、调用service 更新课程状态
        learningLessonService.addUserLesson(orderBasicDTO.getUserId(), orderBasicDTO.getCourseIds());

    }
}
